package com.virtualperson.dto;

import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Min;
import javax.validation.constraints.Max;
import javax.validation.constraints.Size;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.DecimalMax;

@Data
public class VideoGenerationRequest {
    @NotBlank(message = "模型名称不能为空")
    private String model = "liveportrait";  // 固定使用liveportrait模型
    
    @NotNull(message = "输入参数不能为空")
    private Input input;
    
    private Parameters parameters;

    @Data
    public static class Input {
        @NotBlank(message = "图片URL不能为空")
        private String image_url;  // 注意：使用下划线命名以匹配API要求
        
        @NotBlank(message = "音频URL不能为空")
        private String audio_url;  // 注意：使用下划线命名以匹配API要求
    }

    @Data
    public static class Parameters {
        private String template_id = "normal";  // 可选：normal, calm, active
        
        @Min(value = 0, message = "眨眼频率不能小于0")
        @Max(value = 1, message = "眨眼频率不能大于1")
        private Float eye_move_freq = 0.5f;  // 每秒眨眼次数，0-1
        
        @Min(value = 15, message = "视频帧率不能小于15")
        @Max(value = 30, message = "视频帧率不能大于30")
        private Integer video_fps = 24;  // 输出视频帧率，15-30
        
        @Min(value = 0, message = "嘴部动作幅度不能小于0")
        @Max(value = 1, message = "嘴部动作幅度不能大于1")
        private Float mouth_move_strength = 1.0f;  // 嘴部动作幅度，0-1.5
        
        private Boolean paste_back = true;  // 是否将生成的人脸贴回原图
        
        @Min(value = 0, message = "头部动作幅度不能小于0")
        @Max(value = 1, message = "头部动作幅度不能大于1")
        private Float head_move_strength = 0.7f;  // 头部动作幅度，0-1

        @NotNull(message = "视频时长不能为空")
        @DecimalMin(value = "1.0", message = "视频时长不能小于1秒")
        @DecimalMax(value = "300.0", message = "视频时长不能超过300秒")
        private Float duration;  // 视频时长（秒）
        
        @Min(value = 0, message = "音量不能小于0")
        @Max(value = 100, message = "音量不能大于100")
        private Integer volume;  // 音量大小，0-100
        
        @Size(max = 1000, message = "备注信息不能超过1000个字符")
        private String remark;  // 备注信息
    }
    
    // 验证方法
    public void validate() {
        if (parameters != null) {
            if (parameters.getDuration() != null && (parameters.getDuration() < 1.0f || parameters.getDuration() > 300.0f)) {
                throw new IllegalArgumentException("视频时长必须在1-300秒范围内");
            }
            if (parameters.getVolume() != null && (parameters.getVolume() < 0 || parameters.getVolume() > 100)) {
                throw new IllegalArgumentException("音量必须在0-100范围内");
            }
            if (parameters.getRemark() != null && parameters.getRemark().length() > 1000) {
                throw new IllegalArgumentException("备注信息不能超过1000个字符");
            }
        }
    }
} 